dat_full <- preprocessing(root_dir, data_dir)
dat <- subset(dat_full, subset=RT>0 & RT<25000) # loses 2 RTs that were judged to be outliers 25978 49871
dat_borderline <- dat
dat <- perSubjectTrim.fnc(dat, response='RT', subject='Subject', trim = 2.5)$data
## ......
## n.removed = 204
## percent.removed = 2.797203
dat$RT_log <- log(dat$RT)
The main aim of this experiment was to see whether vague instructions would confer advantages over crisp alternatives when all instructions used numerals, and when there were vague and crisp versions of each of the comparison and matching strategies.
On each trial, first the referring expression that constituted the instruction for that trial was displayed (e.g., “Choose a square with about 10 dots”). Participants then pressed a key to indicate that they had read the instruction.
The instruction remained on screen, and after 1000 ms, the arrays appeared (see Figure below).Response time was measured from the presentation of the arrays until the keypress indicating the participant’s choice. The trial would timeout after 60 seconds if there was no response.
In this experiment, no feedback was given. This was because, in the vague conditions, we did not regard any response as “correct” or “incorrect”, but instead as “expected response”; “borderline response”; and “extreme response”, and we did not want to draw participants’ attention to this distinction explicitly. Which choice the participant made was recorded for analysis.
We changed “fewer than” (crisp) to “far fewer than” (in vague): this was because “far fewer than” can have borderline cases whereas “fewer than” cannot have borderline cases.
| Item | Quantity | Selection | Crisp | Vague |
|---|---|---|---|---|
| 06:15:24 | Small | Comparison | Choose a square with fewer than 20 dots | Choose a square with far fewer than 20 dots |
| 06:15:24 | Small | Matching | Choose a square with 6 dots | Choose a square with about 10 dots |
| 06:15:24 | Large | Comparison | Choose a square with more than 10 dots | Choose a square with far more than 10 dots |
| 06:15:24 | Large | Matching | Choose a square with 24 dots | Choose a square with about 20 dots |
| 16:25:34 | Small | Comparison | Choose a square with fewer than 30 dots | Choose a square with far fewer than 30 dots |
| 16:25:34 | Small | Matching | Choose a square with 16 dots | Choose a square with about 20 dots |
| 16:25:34 | Large | Comparison | Choose a square with more than 20 dots | Choose a square with far more than 20 dots |
| 16:25:34 | Large | Matching | Choose a square with 34 dots | Choose a square with about 30 dots |
| 26:35:44 | Small | Comparison | Choose a square with fewer than 40 dots | Choose a square with far fewer than 40 dots |
| 26:35:44 | Small | Matching | Choose a square with 26 dots | Choose a square with about 30 dots |
| 26:35:44 | Large | Comparison | Choose a square with more than 30 dots | Choose a square with far more than 30 dots |
| 26:35:44 | Large | Matching | Choose a square with 44 dots | Choose a square with about 40 dots |
| 36:45:54 | Small | Comparison | Choose a square with fewer than 50 dots | Choose a square with far fewer than 50 dots |
| 36:45:54 | Small | Matching | Choose a square with 36 dots | Choose a square with about 40 dots |
| 36:45:54 | Large | Comparison | Choose a square with more than 40 dots | Choose a square with far more than 40 dots |
| 36:45:54 | Large | Matching | Choose a square with 54 dots | Choose a square with about 50 dots |
dat_plot <- summarySEwithin2(dat, measurevar="RT_log", withinvars=c("Vagueness", "Selection", "Item"), idvar="Subject")
We formulated the following hypotheses:
Response times were trimmed at 25,000 ms, resulting in the loss of 2 trials that were judged to have outlier RTs. The remaining data were trimmed separately for each participant at 2.5 standard deviations below and above that participant’s mean RT, leading to the loss of 204 trials (2.8% of the remaining trials). RTs in milliseconds were log-transformed so that they better approximated a normal distribution for the purposes of analysis.
dat_model <- dat
dat_model$c_Vag <- ifelse(dat_model$Vagueness=="Crisp", -0.5, 0.5)
dat_model$c_Sel <- ifelse(dat_model$Selection=="Comparison", -0.5, 0.5)
dat_model$c_Itm <- ifelse(dat_model$Item=="06:15:24", -.75, ifelse(dat_model$Item=="16:25:34", -.25, ifelse(dat_model$Item=="26:35:44", .25, .75)))
rtlmer = lmerTest::lmer(data=dat_model, RT_log ~ c_Vag * c_Sel + c_Itm + (1 + c_Vag * c_Sel + c_Itm | Subject))
pretty_coef_table(rtlmer, "rt_lmer_full_model_all_items")
| term | 𝛽 | s.e. | d.f. | 𝑡 | 𝑝 | Pr(>|t|) | sig. |
|---|---|---|---|---|---|---|---|
| c_Vag | -0.0051 | 0.014 | 36.94 | -0.37 | 7.16e-01 | 0.716 | |
| c_Sel | 0.1619 | 0.026 | 36.99 | 6.24 | 2.97e-07 | <0.001 | *** |
| c_Itm | 0.0580 | 0.018 | 36.92 | 3.23 | 2.60e-03 | <0.01 | ** |
| c_Vag:c_Sel | 0.1324 | 0.031 | 36.87 | 4.23 | 1.49e-04 | <0.001 | *** |
dat_model <- subset(dat, subset=Selection=='Comparison')
dat_model$c_Vag <- ifelse(dat_model$Vagueness=="Crisp", -0.5, 0.5)
dat_model$c_Itm <- ifelse(dat_model$Item=="06:15:24", -.75, ifelse(dat_model$Item=="16:25:34", -.25, ifelse(dat_model$Item=="26:35:44", .25, .75)))
comp_lmer <- lmerTest::lmer(data=dat_model, RT_log ~ c_Vag + c_Itm + (1 + c_Vag + c_Itm | Subject))
pretty_coef_table(comp_lmer, "rt_lmer_for_comparison_all_items")
| term | 𝛽 | s.e. | d.f. | 𝑡 | 𝑝 | Pr(>|t|) | sig. |
|---|---|---|---|---|---|---|---|
| c_Vag | -0.071 | 0.020 | 36.99 | -3.52 | 1.15e-03 | <0.01 | ** |
| c_Itm | 0.090 | 0.020 | 37.02 | 4.61 | 4.68e-05 | <0.001 | *** |
dat_model <- subset(dat, subset=Selection=='Matching')
dat_model$c_Vag <- ifelse(dat_model$Vagueness=="Crisp", -0.5, 0.5)
dat_model$c_Itm <- ifelse(dat_model$Item=="06:15:24", -.75, ifelse(dat_model$Item=="16:25:34", -.25, ifelse(dat_model$Item=="26:35:44", .25, .75)))
match_lmer <- lmerTest::lmer(data=dat_model, RT_log ~ c_Vag + c_Itm + (1 + c_Vag + c_Itm | Subject))
pretty_coef_table(match_lmer, "rt_lmer_for_matching_all_items")
| term | 𝛽 | s.e. | d.f. | 𝑡 | 𝑝 | Pr(>|t|) | sig. |
|---|---|---|---|---|---|---|---|
| c_Vag | 0.062 | 0.021 | 36.32 | 2.91 | 6.14e-03 | <0.01 | ** |
| c_Itm | 0.025 | 0.022 | 36.62 | 1.12 | 2.71e-01 | 0.271 |
Considering the first set of models:
The second set of models considered were conducted to test for main effects in the presence of interactions involving those main effects (after Levy, 2018).
The variables are: Vagueness 2 levels (X) Item 4 levels (Y) Selection 2 levels (Z)
Note that the null-hypothsesis model includes random slopes for the main effect of X; Y; and Z; as well as for their interactions – including a seperate random slope for all combiations of X, Y, and Z achieves this.
#dat$XYZ <- with(dat, factor(paste(Vagueness,Item,Selection)))
dat_model <- subset(dat, select=c(Subject, Item, Vagueness, Selection, RT_log))
Item.numeric <- sapply(dat_model$Item,function(i) contr.sum(4)[i,])
dat_model$Item1 <- Item.numeric[1,]
dat_model$Item2 <- Item.numeric[2,]
dat_model$Item3 <- Item.numeric[3,]
Selection.numeric <- sapply(dat_model$Selection,function(i) contr.sum(2)[i,])
dat_model$Selection1 <- Selection.numeric[]
Vagueness.numeric <- sapply(dat_model$Vagueness,function(i) contr.sum(2)[i,])
dat_model$Vagueness1 <- Vagueness.numeric[]
dat_model$c_Itm <- ifelse(dat_model$Item=="06:15:24", -.75, ifelse(dat_model$Item=="16:25:34", -.25, ifelse(dat_model$Item=="26:35:44", .25, .75)))
head(dat_model)
## Subject Item Vagueness Selection RT_log Item1 Item2 Item3
## 1 s01 06:15:24 Vague Comparison 6.903747 1 0 0
## 2 s01 16:25:34 Crisp Matching 7.194437 0 1 0
## 3 s01 26:35:44 Vague Comparison 6.987490 0 0 1
## 4 s01 36:45:54 Vague Comparison 7.118016 -1 -1 -1
## 5 s01 06:15:24 Crisp Matching 7.221836 1 0 0
## 6 s01 16:25:34 Crisp Comparison 6.878326 0 1 0
## Selection1 Vagueness1 c_Itm
## 1 1 -1 -0.75
## 2 -1 1 -0.25
## 3 1 -1 0.25
## 4 1 -1 0.75
## 5 -1 1 -0.75
## 6 1 1 -0.25
# make the null model
null.model <- lmer(RT_log ~
Item1 + Vagueness1:Item1 +
Item2 + Vagueness1:Item2 +
Item3 + Vagueness1:Item3 +
Selection1 + Vagueness1:Selection1 +
(Vagueness1 * Selection1 * c_Itm |Subject), dat_model, REML=FALSE)
## Warning in commonArgs(par, fn, control, environment()): maxfun < 10 *
## length(par)^2 is not recommended.
pretty_coef_table(null.model, "null model")
| term | 𝛽 | s.e. | d.f. | 𝑡 | 𝑝 | Pr(>|t|) | sig. |
|---|---|---|---|---|---|---|---|
| Item1 | -0.054 | 0.0136 | 55.79 | -3.98 | 2.00e-04 | <0.001 | *** |
| Item2 | 0.014 | 0.0094 | 957.52 | 1.46 | 1.44e-01 | 0.144 | |
| Item3 | 0.028 | 0.0094 | 959.97 | 3.01 | 2.70e-03 | <0.01 | ** |
| Selection1 | -0.051 | 0.0118 | 37.90 | -4.33 | 1.07e-04 | <0.001 | *** |
| Item1:Vagueness1 | -0.040 | 0.0092 | 356.83 | -4.36 | 1.68e-05 | <0.001 | *** |
| Vagueness1:Item2 | 0.019 | 0.0088 | 5499.98 | 2.18 | 2.92e-02 | <0.05 | * |
| Vagueness1:Item3 | 0.024 | 0.0088 | 5543.55 | 2.76 | 5.80e-03 | <0.01 | ** |
| Vagueness1:Selection1 | 0.028 | 0.0075 | 41.03 | 3.70 | 6.32e-04 | <0.001 | *** |
# make the full model
full.model <- lmer(RT_log ~
Item1 + Vagueness1:Item1 +
Item2 + Vagueness1:Item2 +
Item3 + Vagueness1:Item3 +
Selection1 + Vagueness1:Selection1 + Vagueness1 +
(Vagueness1 * Selection1 * c_Itm |Subject), dat_model, REML=FALSE)
## Warning in commonArgs(par, fn, control, environment()): maxfun < 10 *
## length(par)^2 is not recommended.
pretty_coef_table(full.model, "full model")
| term | 𝛽 | s.e. | d.f. | 𝑡 | 𝑝 | Pr(>|t|) | sig. |
|---|---|---|---|---|---|---|---|
| Item1 | -0.0523 | 0.0140 | 54.26 | -3.72 | 4.70e-04 | <0.001 | *** |
| Item2 | 0.0144 | 0.0095 | 849.10 | 1.51 | 1.31e-01 | 0.131 | |
| Item3 | 0.0278 | 0.0095 | 850.66 | 2.92 | 3.55e-03 | <0.01 | ** |
| Selection1 | -0.0524 | 0.0121 | 37.96 | -4.33 | 1.05e-04 | <0.001 | *** |
| Vagueness1 | 0.0033 | 0.0068 | 38.78 | 0.48 | 6.32e-01 | 0.632 | |
| Item1:Vagueness1 | -0.0395 | 0.0092 | 303.48 | -4.30 | 2.32e-05 | <0.001 | *** |
| Vagueness1:Item2 | 0.0194 | 0.0088 | 5307.77 | 2.20 | 2.81e-02 | <0.05 | * |
| Vagueness1:Item3 | 0.0242 | 0.0088 | 5345.92 | 2.74 | 6.11e-03 | <0.01 | ** |
| Vagueness1:Selection1 | 0.0277 | 0.0075 | 41.07 | 3.69 | 6.47e-04 | <0.001 | *** |
# do model comparison between the null and full models
anova(null.model, full.model)
## Data: dat_model
## Models:
## null.model: RT_log ~ Item1 + Vagueness1:Item1 + Item2 + Vagueness1:Item2 +
## null.model: Item3 + Vagueness1:Item3 + Selection1 + Vagueness1:Selection1 +
## null.model: (Vagueness1 * Selection1 * c_Itm | Subject)
## full.model: RT_log ~ Item1 + Vagueness1:Item1 + Item2 + Vagueness1:Item2 +
## full.model: Item3 + Vagueness1:Item3 + Selection1 + Vagueness1:Selection1 +
## full.model: Vagueness1 + (Vagueness1 * Selection1 * c_Itm | Subject)
## Df AIC BIC logLik deviance Chisq Chi Df Pr(>Chisq)
## null.model 46 8539.7 8855.6 -4223.9 8447.7
## full.model 47 8541.6 8864.4 -4223.8 8447.6 0.0973 1 0.7551